import App from '../base'
App.controller('AccountSettingsController', function(
  $scope,
  $http,
  $modal,
  // eslint-disable-next-line camelcase
  eventTracking,
  UserAffiliationsDataService
) {
  $scope.subscribed = true

  $scope.unsubscribe = function() {
    $scope.unsubscribing = true
    return $http({
      method: 'DELETE',
      url: '/user/newsletter/unsubscribe',
      headers: {
        'X-CSRF-Token': window.csrfToken
      }
    })
      .then(function() {
        $scope.unsubscribing = false
        $scope.subscribed = false
      })
      .catch(() => ($scope.unsubscribing = true))
  }

  $scope.deleteAccount = function() {
    $modal.open({
      templateUrl: 'deleteAccountModalTemplate',
      controller: 'DeleteAccountModalController',
      resolve: {
        userDefaultEmail() {
          return UserAffiliationsDataService.getUserDefaultEmail()
            .then(
              defaultEmailDetails =>
                (defaultEmailDetails != null
                  ? defaultEmailDetails.email
                  : undefined) || null
            )
            .catch(() => null)
        }
      }
    })
  }

  $scope.upgradeIntegration = service =>
    eventTracking.send('subscription-funnel', 'settings-page', service)
})

App.controller('DeleteAccountModalController', function(
  $scope,
  $modalInstance,
  $timeout,
  $http,
  userDefaultEmail
) {
  $scope.state = {
    isValid: false,
    deleteText: '',
    password: '',
    confirmSharelatexDelete: false,
    inflight: false,
    error: null
  }

  $scope.userDefaultEmail = userDefaultEmail

  $modalInstance.opened.then(() =>
    $timeout(() => $scope.$broadcast('open'), 700)
  )

  $scope.checkValidation = () =>
    ($scope.state.isValid =
      userDefaultEmail != null &&
      $scope.state.deleteText.toLowerCase() ===
        userDefaultEmail.toLowerCase() &&
      $scope.state.password.length > 0 &&
      $scope.state.confirmSharelatexDelete)

  $scope.delete = function() {
    $scope.state.inflight = true
    $scope.state.error = null
    return $http({
      method: 'POST',
      url: '/user/delete',
      headers: {
        'X-CSRF-Token': window.csrfToken,
        'Content-Type': 'application/json'
      },
      data: {
        password: $scope.state.password
      },
      disableAutoLoginRedirect: true // we want to handle errors ourselves
    })
      .then(function() {
        $modalInstance.close()
        $scope.state.inflight = false
        $scope.state.error = null
        setTimeout(() => (window.location = '/login'), 1000)
      })
      .catch(function(response) {
        const { data, status } = response
        $scope.state.inflight = false
        if (status === 403) {
          $scope.state.error = { code: 'InvalidCredentialsError' }
        } else if (data.error) {
          $scope.state.error = { code: data.error }
        } else {
          $scope.state.error = { code: 'UserDeletionError' }
        }
      })
  }

  $scope.cancel = () => $modalInstance.dismiss('cancel')
})
